namespace mecs {
    export class LogicFrame {

        /** 当前的逻辑帧id */
        crtId: number;
        /** 逻辑帧的每帧时间间隔 */
        delay: number;
        /** 是否需要回滚的逻辑帧id */
        rollbackFrameId = 0;
        /** 保存当前最大的逻辑帧id,用于判断是否要追帧 */
        maxLogicFrameId = 0;
        /** 记录所有的逻辑关键帧数据 */
        allCache: { [id: number]: ILogicFrameData };
        /** 是否在追帧中，追帧时不能进行操作 */
        rollbacking = false;

        constructor(delay = 20) {
            this.init(delay)
        }

        init(delay = 20, crtId: number = 0) {
            this.allCache = {}

            this.crtId = crtId;
            this.delay = delay;
            this.maxLogicFrameId = 0;
            this.rollbackFrameId = 0;
        }

        getFrame(id?: number) {
            if (isNaN(id)) {
                id = this.crtId;
            }
            return this.allCache[id];
        }

        setFrame(id: number, frame: ILogicFrameData) {
            this.allCache[id] = frame;
            if (id > this.maxLogicFrameId) {
                this.maxLogicFrameId = id;
            }
        }

        addFrames(id: number, cmds: ICmd[]) {
            if (cmds.length) {
                cmds.forEach(c => {
                    this.addFrame(id, c);
                })
            } else {
                this.setFrame(id, { id: id, cmds: [] });
            }
        }

        addFrame(id: number, cmd: ICmd) {
            let f = this.getFrame(id);
            // 这里后期要判断，当前的这一帧是否有同样的动作，避免重复，不能直接设置，而是插入当前帧的动作
            if (f) {
                f.cmds.push(cmd);
            } else {
                this.setFrame(id, { id: id, cmds: [cmd] });
            }
            if (id > this.maxLogicFrameId) {
                this.maxLogicFrameId = id;
            }
        }

        dispose(){
            this.allCache = null;
        }
    }
}